Skip to content

Dockerfile 文件内容制作指南 ​

文件下载 ​

docker-web(官方镜像源).zip

docker-web(来源dasctfbase).zip

文件包结构 ​

文件包内应确保具有如下的文件。

  1. docker-compose.yml – Docker-Compose 描述文件
  2. web1 – 服务构建文件,下有 Dockerfile 和构建所需的文件等

docker-compose.yml ​

Docker-Compose 描述文件, 内容如下:

# 指定该文件版本
version: '3'
# 把每个子目录视为一个镜像,开始构建
services:
  web1:
    # 此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明。
    build: ./web1/
    ports:
      - "18098:80"

此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明!!!

此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明!!!

此处仅允许 image, build, ports,禁止其他字段出现,如果有 volume,cmd 等设置需求,请在 Dockerfile 里进行文件拷贝或者申明!!!

ports 里映射的镜像端口请务必保证正确!

web1 ​

服务构建文件,下有 Dockerfile 和构建所需的文件等。

Dockerfile 内容参考样例如下:

1.样例1

# 只允许使用下文中限定的镜像
FROM php:7.4-apache

# 拷贝支撑文件到临时目录。
COPY files /tmp/files/

# 拷贝源码到相应目录下。
COPY src /var/www/html/

# 执行命令,设置权限,安装依赖等。
# 在镜像启动阶段禁止执行需要长时间运行(编译等)以及需要访问互联网(安装包等)操作,此类操作请在此处完成。
# 命令请在一个 RUN 里执行,不要拆分成多个 RUN 以减小镜像体积。
RUN chown -R root:root /var/www/html/ && \
    chmod -R 755 /var/www/html && \
    mv /tmp/files/flag.sh / && \
    mv /tmp/files/start.sh / && \
    mv /tmp/files/db.sql /db.sql && \
    chmod +x /flag.sh /start.sh && \
    sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
	  sed -i '/security/d' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install libaio1 libnuma1 psmisc libmecab2 -y && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-common_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-community-client_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-client_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-community-server_5.7.29-1debian10_amd64.deb && \
    DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/files/mysql-server_5.7.29-1debian10_amd64.deb && \
    rm -rf /tmp/files && \
    docker-php-ext-install mysqli pdo pdo_mysql && \
    rm -rf /var/lib/apt/lists/*

# 指定启动命令。
CMD /start.sh

# 申明环境变量,环境变量都在此声明
ENV DASFLAG DASCTF{test12345}

# 请务必在镜像末尾申明该镜像需要暴露的端口!
EXPOSE 80

2.样例2

# 只允许使用下文中限定的镜像
FROM dasctfbase/web_php73_apache_mysql

COPY ./src /var/www/html
# 如需自定义 FLAG 请将自定义脚本覆盖到 /flag.sh
COPY files/flag.sh /flag.sh
# 如需操作数据库请将 sql 文件拷贝到 /db.sql
COPY files/db.sql /db.sql

# 如有上传文件等操作请务必将权限设置正确!
# RUN chown www-data:www-data /var/www/html/uploads/
RUN /bin/bash && chmod 755 /var/www/html && \
    sed -i "1i \ServerName localhost:80" /etc/apache2/apache2.conf && \
    chmod +x /flag.sh

# 申明环境变量,这里有一个 /flag.sh 从环境变量中获取 flag,所以需要声明。
ENV DASFLAG DASCTF{test12345}

# 请声明对外暴露端口
EXPOSE 80

需要特别注意几点:

1. FROM 的基础镜像只允许是:

  1. Dockerhub上不带 / 的官方镜像
  2. dasctfbase 组织下的镜像,比如 dasctfbase/web_php73_apache_mysql 等
  3. https://github.com/orgs/DASCTF-Offical/packages 里的镜像,也就是 ghcr.io/dasctf-offical/ 开头的镜像

其他镜像一律不允许使用。

其他镜像一律不允许使用。

其他镜像一律不允许使用。

2. 请设置一个 DASFLAG 环境变量来作为预置的 flag 以供测试。

ENV DASFLAG DASCTF{test12345}

3. 请正确声明容器对外暴露的端口。

EXPOSE 80

4. CMD 及其附属的启动脚本禁止使用输出文字等方式来保持运行。

比如


while true; do
  echo '1'
done

禁止使用这种输出日志的方式来保持运行。

禁止使用这种输出日志的方式来保持运行。

禁止使用这种输出日志的方式来保持运行。

可以使用如下所示等方式来保持运行

# 方式一
tail -f /dev/null

# 方式二
sleep infinity